package com.liukunup.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

/**
 * Properties 工具类
 * @author Liu Kun
 * @date 2021-04-04 13:44:30
 **/
@Slf4j
public class PropertiesUtil {

    /**
     * 读取配置文件
     * @param filename 配置文件名称
     * @return 配置对象
     */
    private static Properties readProperties(String filename) {
        Properties properties = new Properties();
        try {
            InputStream is = PropertiesUtil.class.getResourceAsStream(filename);
            InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
            properties.load(isr);
            isr.close();
            is.close();
        } catch (IOException e) {
            log.error("Exception: {}", e.getMessage());
        }
        return properties;
    }

    /**
     * 获取字符串配置
     * @param filename     配置文件
     * @param key          键名
     * @param defaultValue 默认值
     * @return 键值
     */
    public static String getString(String filename, String key, String defaultValue) {
        Properties properties = readProperties(filename);
        return properties.getProperty(key, defaultValue);
    }

    /**
     * 获取数值配置
     * @param filename     配置文件
     * @param key          键名
     * @param defaultValue 默认值
     * @param <T>          类型
     * @return 数值
     */
    public static <T extends Number> T getNumber(String filename, String key, T defaultValue, Class<T> classOfT) {
        String value = getString(filename, key, null);
        if (StringUtils.isEmpty(value)) {
            return defaultValue;
        }
        try {
            if (defaultValue instanceof Byte) {
                return classOfT.cast(Byte.parseByte(value));
            }
            if (defaultValue instanceof Short) {
                return classOfT.cast(Short.parseShort(value));
            }
            if (defaultValue instanceof Integer) {
                return classOfT.cast(Integer.parseInt(value));
            }
            if (defaultValue instanceof Long) {
                return classOfT.cast(Long.parseLong(value));
            }
            if (defaultValue instanceof Float) {
                return classOfT.cast(Float.parseFloat(value));
            }
            if (defaultValue instanceof Double) {
                return classOfT.cast(Double.parseDouble(value));
            }
        } catch (NumberFormatException e) {
            return defaultValue;
        }
        return null;
    }

    /**
     * 获取日期配置
     * @param filename     配置文件
     * @param key          键名
     * @param defaultValue 默认值
     * @param fmt          日期格式
     * @return 日期
     */
    public static Date getDate(String filename, String key, Date defaultValue, String fmt) {
        String value = getString(filename, key, null);
        if (StringUtils.isEmpty(value)) {
            return defaultValue;
        }
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(fmt);
            return sdf.parse(value);
        } catch (ParseException e) {
            return defaultValue;
        }
    }
}
